<?php
/**
* b2b168操作
*/
class b2b168
{
    //**** 定义私有变量 ****//

        // 用户信息相关
        private $userName;          // 用户账号
        private $userPass;          // 用户密码
        private $userCookies;       // 登录Cookies
        private $status = 0;        // 状态

        // 定义错误信息
        private $errorMsg;          // 错误信息

        // 系统选项相关
        private $options = array(
            'recordsFile' => './userRecords.json',   // 记录用户信息的文件
        );

        //  文章默认选填参数
        private $postOptions = array(
            'classAll'   => true,     // 文章分类(全站) $("#oClsSel0").val()
            'title'      => true,     // 文章标题(完整)
            'titleShort' => '',       // 文章短标题
            'format'     => '',       // 产品规格
            'price'      => '1',      // 产品单价
            'priceUnit'  => '0',      // 价格币种 默认为 0 人民币
            'num'        => '1',      // 产品数量
            'numUnit'    => '位',     // 产品数量单位
            'selUnit'    => '位',     // 产品价格单位(下拉菜单 应该用不到)
            'pack'       => '',       // 包装说明
            'body'       => true,     // 详细描述
            'classPre'   => true,     // 产品分类(站内) $("#YSVJMDTP").val()
            'address'    => 1203,     // 产品发货地    $("#oRgnSel0").val()
            'public'     => 0,        // 公开状态 默认 0 公开
            'keyword1'   => '',       // 关键词 6个
            'keyword2'   => '',       // 关键词 6个
            'keyword3'   => '',       // 关键词 6个
            'keyword4'   => '',       // 关键词 6个
            'keyword5'   => '',       // 关键词 6个
            //'keyword6'   => '',       // 关键词 6个
            'validTime'  => 10000,    // 有效期
            // 'VCode'      => '请点击输入',       // 验证码
            'Submit'     => '确定无误，马上发布',       // 提交按钮
            'a'          => 1,    // 未知 默认为1 不可输入
            'unkn1'      => 0,    // 未知 默认为0 不可输入 IPWMUKSV
            'oInp0'      => '',   // 插图一
            'oInp1'      => '',   // 插图二
            'oInp2'      => '',   // 插图三
            'unkn12'     => '',   // 未知 默认为空 EOOMNTXE
            'q'          => '',   // 校验字符 需要每次获取
        );

    /**
     * 初始化函数
     * @param string $userName    用户账号
     * @param string $userPass    用户密码
     * @param string $userCookies 登录Cookies
     * @param array  $options     配置选项信息
     */
    function __construct($userName, $userPass, $userCookies = null, $options = array())
    {
        $this->userName = $userName;  // 保存用户账号
        $this->userPass = $userPass;  // 保存用户密码

        // 识别并保存配置选项
        foreach ($options as $optKey => $optValue)
            $this->options[$optKey] = $optValue;

        // 检查保存用户信息的文件
        file_exists($this->options['recordsFile']) ?: file_put_contents($this->options['recordsFile'], '{}');

        // 设置并保存Cookies
        if(!$userCookies){
            $userRecords = json_decode(file_get_contents($this->options['recordsFile']), true);
            if(!empty($userRecords[$this->userName]['Cookies']))
                $userCookies = $userRecords[$this->userName]['Cookies'];
        }

        $this->setCookie($userCookies) ?: $this->errorMsg = 'NotLogin';
    }

    /**
     * 获取上次操作的错误信息
     * @return string 错误信息描述
     */
    public function getErrorMsg()
    {
        return $this->errorMsg;
    }

    /**
     * 设置并验证用户Cookies
     * @param string $cookies 用户Cookies
     */
    public function setCookie($cookies = null)
    {
        // 验证登录的地址
        $url = 'http://m.b2b168.com/Default.aspx';

        // 提交请求
        $retHtml = Get_Web_Contents($url, 'GET', '',$cookies);
        if(isset($retHtml['Error'])) {
            $this->errorMsg = 'cUrl请求时出错';
            return false;
        }

        // 判断是否已经登录
        if($retHtml['Info']['http_code'] == 200){
            $this->userCookies = $cookies;
            $this->status      = 1;
            return true;
        } else {
            $this->status   = 0;
            $this->errorMsg = '账号未登录';
            return false;
        }
    }

    /**
     * 保存用户的Cookies
     */
    public function saveCookie()
    {
        if($this->status <= 0) {
            $this->errorMsg = '登录状态不正确';
            return false;
        }
        $userRecords = json_decode(file_get_contents($this->options['recordsFile']), true);
        $userRecords[$this->userName]['Cookies'] = $this->userCookies;
        if(!file_put_contents($this->options['recordsFile'], json_encode($userRecords))){
            $this->errorMsg = '保存到json文件失败';
            return false;
        }
        return true;
    }

    /**
     * 用户账号登录
     * @param  string $userName 需要登录的用户账号
     * @param  string $userPass 需要登录的用户密码
     * @return mixed            登录成功返回用户Cookies 失败返回 false
     */
    public function userLogin($userName = null, $userPass = null)
    {
        // 设置账号密码
        $userName ?: $userName = $this->userName;
        $userPass ?: $userPass = $this->userPass;

        // 登录提交的地址
        $url = 'http://m.b2b168.com/Login.aspx';

        // 获取登录表单信息
        $retHtml = Get_Web_Contents($url);
        if(empty($retHtml['Body'])){
            $this->errorMsg = 'cUrl请求时出错.';
            return false;
        }

        // 匹配表单字段名
        $regEx = '#<input id="[^"]+" name="(?<name>[^"]+)"[^>]+ms-duplex="(?<type>[^"]+)"[^>]+/>#';
        if(!preg_match_all($regEx, $retHtml['Body'], $formInfo)) {
            $this->errorMsg = '匹配表单字段名失败.';
            return false;
        }

        // 生成表单信息
        $data = '';
        foreach ($formInfo['type'] as $key => $type) {
            switch ($type) {
                case 'txtHandphoneNo':
                    $data.= "{$formInfo['name'][$key]}={$userName}&";
                    break;
                case 'txtPassword':
                    $data.= "{$formInfo['name'][$key]}={$userPass}&";
                    break;
                default:
                    # code...
                    break;
            }
        }
        $data.= 'a=1&url=';

        // 提交登录数据
        $retHtml = Get_Web_Contents($url, 'POST', $data);
        if(isset($retHtml['Error'])) {
            $this->errorMsg = 'cUrl请求时出错.';
            return false;
        }

        // 判断登录返回提示
        $regEx = '#<ul class="login-content">.*?<div[^>]+>(?<tis>[^<]+)<#s';
        if(!preg_match($regEx, $retHtml['Body'], $retTis)){
            $this->errorMsg = '未匹配到登录返回信息.';
            return false;
        }

        // 构造返回信息
        if(!stripos($retTis['tis'], '成功')){
            $this->errorMsg = $retTis['tis'];
            return false;
        }

        $this->userCookies = $retHtml['Cookies'];
        $this->status      = 1;
        return $retHtml['Cookies'];
    }

    /**
     * 发布文章
     * @param  string  $title    文章标题
     * @param  string  $body     文章内容
     * @param  integer $classID  分类ID(全站)
     * @param  integer $columnID 栏目ID(本站)
     * @param  array   $options  其他选项
     * @return [type]           [description]
     */
    public function postAdd($title, $body, $classID, $columnID, $options = array())
    {
        $url = 'http://m.b2b168.com/Supply.aspx';

        // 获取页面内容用来提取表单字段名
        $retHtml = Get_Web_Contents($url, 'GET', '', $this->userCookies);
        if(isset($retHtml['Error'])) {
            $this->errorMsg = 'cUrl请求时出错.';
            return false;
        }
        // 获取表单正文
        $regEx = '#<form[^>]+name="fSupply"[^>]+>(?<form>.*?)</form>#s';
        if(!preg_match($regEx, $retHtml['Body'], $formBody)){
            // 先检查是否频繁
            $this->errorMsg = '提取表单正文时失败.';
            if(stripos($retHtml['Body'], '休息一会')){
                $this->errorMsg = '操作频繁';
            }
            return false;
        }

        // 获取表单字段
        $regEx = '#name="(?<name>[^"]+)"#';
        if(!preg_match_all($regEx, $formBody['form'], $formList)){
            $this->errorMsg = '提取表单字段列表时出错.';
            return false;
        }
        $formList = $formList['name'];

        // 获取 验证 q 的值
        $regEx = '#name="q" value="(?<val>[0-9A-Za-z]+)"#';
        if(!preg_match($regEx, $formBody['form'], $formQ)){
            $this->errorMsg = '提取表单校验时出错.';
            return false;
        }

        // 修改值
        foreach ($options as $optKey => $optValue){
            $this->postOptions[$optKey] = $optValue;
        }

        $this->postOptions['classAll']   = $classID;    // 大栏目ID
        $this->postOptions['title']      = $title;      // 文章标题
        $this->postOptions['titleShort'] = $title;      // 短标题
        $this->postOptions['format']     = $title;      // 规格
        $this->postOptions['body']       = $body;       // 文章内容
        $this->postOptions['classPre']   = $columnID;   // 小栏目ID
        $this->postOptions['keyword5']   = $title;      // 文章关键词
        $this->postOptions['q']          = $formQ['val'];   // 校验码

        // 重新整理值关系
        $i = 0;$postData = array();
        foreach ($this->postOptions as $key => $value) {
            $name = $formList[$i++];
            $postData[$name] = $value;
        }

        $retHtml = Get_Web_Contents($url, 'POST', http_build_query($postData), $this->userCookies);

        if(isset($retHtml['Error'])) {
            $this->errorMsg = 'cUrl请求时出错.';
            return false;
        }

        // 获取错误原因
        $regEx = '#<font color="red">(?<tis>[^<]+)</font>#';
        if(preg_match($regEx, $retHtml['Body'], $retTis)){
            $this->errorMsg = $retTis['tis'];
            return false;
        }

        // 判断是否成功
        if($retHtml['Info']['http_code'] == 302){
            return true;
        }

        //  未知错误
        $this->errorMsg = '未知错误';
        return false;
    }

    /**
     * 获取文章列表
     * @param  integer $page 页码
     * @return array         所有地址
     */
    public function getPostList($page = 1)
    {
        // 拼接读取地址
        $url = "http://m.b2b168.com/SupplyList.aspx?pg=SupplyListTxt&p={$page}";

        // 读取页面内容
        $retHtml = Get_Web_Contents($url, 'GET', '', $this->userCookies);

        // 剔除不需要的代码
        $retHtml = str_ireplace(array('<br />', "\r"), '', $retHtml['Body']);

        // 两个换行分割
        $typeList = explode("\n\n", trim($retHtml));

        // 分割每条记录
        $retList = array();
        $retList['info']  = explode("\n", $typeList['0']);
        $retList['wap']   = explode("\n", $typeList['1']);
        $retList['site']  = explode("\n", $typeList['2']);
        $retList['sitem'] = explode("\n", $typeList['3']);

        $retList['all']  = array_merge($retList['info'], $retList['wap'], $retList['site'], $retList['sitem']);

        return $retList;
    }

	//获取发布文章的所有URL 和 标题 列表
	function savePostUrl_Title($userName,$postList,$i){
		
		$saveErro = "";
		$info = $wap = $site = $sitem  = $titleList = array();//初始化

		$info  = $postList['info'];
		$wap   = $postList['wap'];
		$site  = $postList['site'];
		$sitem = $postList['sitem'];
		$len   = count($site);
		
		$url = "http://m.b2b168.com/SupplyList.aspx?p={$i}";
		$contents = Get_Web_Contents($url, 'GET', '', $this->userCookies);// 读取页面内容
		if (!$contents['Body']) print_r("{$userName}··· 没有读取到底{$i}页的页面内容\n");
        
        //每日记录
        file_put_contents(POST_URL_KEY_LIST.'log/'.date('m-d').".csv", $userName."\n" , FILE_APPEND);
        
		for($j=0; $j<$len; $j++){
			
			$patt = "#{$site[$j]}\" target=\"_blank\">(.+?)</a>#";
			$res = preg_match($patt,$contents['Body'],$getTitle);
			if (!$res) print_r("{$userName}··· 没有获取到标题\n");
			//获取关键词（标题）
			$titleList[] = trim($getTitle[1]);
			$temp = array($info[$j],$wap[$j],$site[$j],$sitem[$j],trim($getTitle[1]));
			$hash = implode(",",$temp);
			unset($temp);
			$res = file_put_contents(POST_URL_KEY_LIST.$userName.".csv", $hash."\n", FILE_APPEND);
            
            //每日记录
			file_put_contents(POST_URL_KEY_LIST.'log/'.date('m-d').".csv", $hash."\n", FILE_APPEND);
			if (!$res) $saveErro = true;
		}
		$json_titleList = json_encode($titleList); 
		return ($saveErro === true) ? false : $json_titleList;
	}
	
	//单独保存关键词
	function saveKey($userName,$json_titleList){
		$titleList = json_decode($json_titleList,true);
		$str_title = implode(",", $titleList);
		$res = file_put_contents(POST_KEY_LOG."{$userName}_key.csv", $str_title.",", FILE_APPEND);
		return ($res == false) ? false : true;
	}
}







